热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android6.0切换指定Wi-Fi的解决方案

本文详细介绍了在Android6.0系统中切换到指定Wi-Fi的方法,包括常见的问题、原因分析及解决方案。通过官方文档和代码示例,帮助开发者更好地理解和实现这一功能。

本文由编程笔记小编整理,主要介绍如何在 Android 6.0 中实现切换到指定 Wi-Fi 的方法,并提供详细的解决方案。



常见问题


1. 在网上找到一个 Wi-Fi 工具类并编写了初步的切换到指定 Wi-Fi 的 demo,测试后一切正常,但在实际设备上却无法连接成功,点击连接时 App 无响应。


2. Wi-Fi 切换速度慢且不稳定,同事建议继续优化。根据设备的 Wi-Fi 加密模式修改了创建 Wi-Fi 的方式,测试后基本都能连上,但偶尔仍不能成功切换。


3. 最近一次测试中,发现切换始终失败,严重影响用户体验。



原因分析


Android 6.0 只允许操作自己创建的 Wi-Fi 配置(WifiConfiguration)。上述问题的主要原因是对“个人创建的 Wi-Fi 配置”理解不到位,以及对 Wi-Fi 加密模式不够熟悉。例如,我们的设备使用的是 WPA2 加密模式,直接使用 WPA2 加密模式后,切换速度和成功率显著提高。



Wi-Fi 类型


Wi-Fi 分为两种类型:一种是通过代码创建的 Wi-Fi,另一种是由用户手动输入密码或由其他应用创建的 Wi-Fi。前者称为个人 Wi-Fi,后者称为系统 Wi-Fi。



Wi-Fi 操作权限


系统 Wi-Fi: 虽然可以通过 WifiManager.getSavedConfigurations() 获取指定 Wi-Fi 的配置信息,但无法进行具体操作,如添加、启用或移除网络。


个人 Wi-Fi: 可以自由进行添加、启用和移除操作。



测试过程


WifiConfiguration wifiNewCOnfiguration= createWifiInfo(aimWifiName, aimWifiPwd); // 使用 WPA2 加密方式
int newNetworkId = wifiManager.addNetwork(wifiNewConfiguration);
Log.e("MainActivity", "newNetworkId:" + newNetworkId);
boolean enableNetwork = wifiManager.enableNetwork(newNetworkId, true);
Log.e("MainActivity", "enableNetwork:" + enableNetwork);


解决方案


为了确保在 Android 6.0 中正确切换到指定 Wi-Fi,以下是最终的解决方案:


WifiConfiguration wifiNewCOnfiguration= createWifiInfo(aimWifiName, aimWifiPwd); // 使用 WPA2 加密方式
int newNetworkId = mWifiManager.addNetwork(wifiNewConfiguration);
if (newNetworkId == -1) {
Log.e("MainActivity", "操作失败,请取消手机 Wi-Fi 列表中对该设备连接的保存");
} else {
boolean enableNetwork = mWifiManager.enableNetwork(newNetworkId, true);
if (!enableNetwork) {
Log.e("MainActivity", "切换到指定 Wi-Fi 失败");
} else {
Log.e("MainActivity", "切换到指定 Wi-Fi 成功");
}
}


Demo 地址


您可以访问 GitHub 上的 Demo 获取完整的代码示例。


推荐阅读
  • 在Java开发中,使用BASE64编码通常可以直接利用JDK内置的库。然而,在Android平台上,由于安全性和兼容性的考虑,直接引用JDK中的`sun.misc.BASE64Decoder`会导致错误,因此需要引入第三方库来实现相同的功能。 ... [详细]
  • 本文介绍了如何通过Java代码计算一个整数的位数,并展示了多个基础编程示例,包括求和、平均分计算、条件判断等。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
  • 本文介绍了如何通过在数据库表中增加一个字段来记录文章的访问次数,并提供了一个示例方法用于更新该字段值。 ... [详细]
  • 序列化与反序列化是数据处理中的重要技术,特别是在网络通信和数据存储中。它们允许将复杂的数据结构转换为可传输或存储的格式,再从这些格式恢复原始数据。本文探讨了序列化与反序列化的基本概念,以及它们在不同协议模型中的角色。 ... [详细]
  • iOS 开发技巧:TabBarController 自定义与本地通知设置
    本文介绍了如何在 iOS 中自定义 TabBarController 的背景颜色和选中项的颜色,以及如何使用本地通知设置应用程序图标上的提醒个数。通过这些技巧,可以提升应用的用户体验。 ... [详细]
  • Ubuntu GamePack:专为游戏爱好者打造的Linux发行版
    随着Linux系统在游戏领域的应用越来越广泛,许多Linux用户开始寻求在自己的系统上畅玩游戏的方法。UALinux,一家致力于推广GNU/Linux使用的乌克兰公司,推出了基于Ubuntu 16.04的Ubuntu GamePack,旨在为Linux用户提供一个游戏友好型的操作环境。 ... [详细]
  • 本文介绍了两种在Android设备上获取MAC地址的有效方法,包括通过Wi-Fi连接和使用移动数据流量的情况。第一种方法依赖于Wi-Fi连接来获取MAC地址,而第二种方法则无需Wi-Fi,直接通过网络接口获取。 ... [详细]
  • Python自动化测试入门:Selenium环境搭建
    本文详细介绍如何在Python环境中安装和配置Selenium,包括开发工具PyCharm的安装、Python环境的设置以及Selenium包的安装方法。此外,还提供了编写和运行第一个自动化测试脚本的步骤。 ... [详细]
  • Java中的基本数据类型与包装类解析
    本文探讨了Java编程语言中的8种基本数据类型及其对应的包装类。通过分析这些数据类型的特性和使用场景,以及自动拆装箱机制的实现原理,帮助开发者更好地理解和应用这些概念。 ... [详细]
  • 本文详细介绍了虚拟专用网(Virtual Private Network, VPN)的概念及其通过公共网络(如互联网)构建临时且安全连接的技术特点。文章探讨了不同类型的隧道协议,包括第二层和第三层隧道协议,并提供了针对IPSec、GRE以及MPLS VPN的具体配置指导。 ... [详细]
  • 本文探讨了当前技术发展趋势,特别是大数据和人工智能如何推动工业互联网的发展。文章分析了全球主要国家在工业互联网领域的进展,并展望了未来工业互联网技术的发展方向。 ... [详细]
  • 本文档详细介绍了在 Kubernetes 集群中部署 ETCD 数据库的过程,包括实验环境的准备、ETCD 证书的生成及配置、以及集群的启动与健康检查等关键步骤。 ... [详细]
author-avatar
小丽之家ko
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有